#pragma once

#include "road.h"

/*******************状态机*********************/
enum LaneChangeType {
  singleType, // 单移线
  doubleType // 双移线
};

/*******************场景基类*******************/
class SceneBase {
  public:
    virtual ~SceneBase() = default; // 虚析构
    virtual void ShowScene(); // 显示，虚函数，子类如果不重写，就调用这个父类的函数
    virtual void ObsMoveStep(){}; // 虚函数，障碍物的单帧移动，
    virtual bool Planning_process() = 0; // 整个过程， 纯虚函数

    /*******************直行*****************/
    void UniformStraight(const double& total_s); // 直行行驶指定距离，total_s为正，为行驶过的指定距离
    void UniformAccBySpeed(const double& target_speed_y); //直行，已知加速度，行驶到指定的速度，匀加减速直线运动
    void UniformAccByDis(const double& dis, const double& target_speed_y); //直行，行驶到指定的距离到达指定的速度，表示匀加减速直线运动
    void UniformAccByTime(const double& time, const double& target_speed_y); // 直行，行驶指定的时间到达指定的速度，表示匀加减速直线运动

    /*******************转向****************/
    // 转向,已知半径和角度 // total_theta为正,为累计转过的角度
    void CarTurn(const int& turn_state, const double& R, const double& total_theta);
    // 变道, target_point表示目标点,type表示变道类型(单移线还是双移线),s表示一阶段变道过来后需要直线行驶的距离.
    void LaneChange(const Point& target_point, const int& type, const double& s = 0.0);

  public:
    std::unique_ptr<RoadBase> road0; // 道路父指针
    std::unique_ptr<CarBase> car0; // 主车父指针
    double speed_limit = -6.0; // 道路限速

     
};